home *** CD-ROM | disk | FTP | other *** search
- {****************************************************************
- * TExtIniF class *
- * created and copyright by Ferdinand Soethe 1996 *
- * (email: f.soethe@oln.comlink.apc.org) *
- * *
- * You may use this source code in your applications *
- * (a word of credit would be nice) but you must not *
- * resell it as part of a library or publish it in paper- *
- * or electronic form without asking my permission. *
- * *
- * TExtIniF extends Delphi's TIniFile to simplify saving a *
- * components state to an INI-File. After creation you can *
- * register any number of components and save and retrieve *
- * their settings with just one call to StoreObjectStates. *
- * *
- ****************************************************************}
-
- unit extINIF;
-
- interface
-
- uses
- {unfortunately we need to include a units of classes
- that we want to be able to store}
- IniFiles, Files, Classes, Forms, StdCtrls, FileCtrl, Menus,
- sysUtils, TabNotBK;
-
- type
- EExtIniFError = class(Exception);
- TExtIniF = class(TIniFile)
- private
- { Private-Deklarationen }
- FAutoStore: boolean; {store all objects states before TExtIniF is destroyed}
- FRegObjects: TStringList; {list of all registered objects}
- FIniSection: String; {Name of [section] where values are stored}
- protected
- { Protected-Deklarationen }
- public
- { Public-Deklarationen }
- constructor create(IniFName: TFileName);
- destructor destroy; override;
- {find the ini section for a registered object}
- function GetIniSection(obj: TObject): string;
- {Add a component to the list of objects}
- procedure RegisterObject(obj: TObject; INISection: string);
- {Remove a component to the list of objects}
- procedure UnRegisterObject(obj: TObject; INISection: string);
- {Retrieve the setting of a single Object}
- procedure ReStoreObjectState(obj: TObject; INISection: string);
- {Restore states of all registered objects}
- procedure RestoreObjectStates;
- {Restore states of all registered objects}
- procedure StoreObjectState(obj: TObject; INISection: string);
- {Store state of a single object}
- procedure StoreObjectStates;
- {Store states of all registered objects}
- published
- { Published-Deklarationen }
- property AutoStore: boolean read FAutoStore write FAutoStore;
- property IniSection: string read FIniSection write FIniSection;
- end;
-
- implementation
-
- { find the section string to a registered object
- if not registered or section string is empty
- return default value}
- function TExtIniF.GetIniSection(obj: TObject): string;
- var
- index: integer;
- begin
- index:= FRegObjects.indexOfObject(obj);
- if ( index > -1 ) then begin
- result:= FRegObjects.strings[index];
- if result = '' then
- result:= FIniSection;
- end else
- result:= FIniSection;
- end; {GetIniSection}
-
- {}
- constructor TExtIniF.create(IniFName: TFileName);
- begin
- {if you don't pass your own name for the ini-File, it will be the name
- of your exe-file with the extension '*.INI'}
- if ( IniFName = '' ) then IniFName:= ExtraxtFileBaseName(application.exename)+'.ini';
- inherited create(IniFName);
- FRegObjects:= TStringList.Create;
- FIniSection:= 'Options';
- end;
-
- {}
- destructor TExtIniF.Destroy;
- begin
- {If AutoStore is set, values are stored
- before TExtIniF-Object is destroyed}
- if FAutoStore then StoreObjectStates;
- FRegObjects.destroy;
- inherited destroy;
- end;
-
- { Add an object to the list of monitored objects. If you pass an empty string
- for INISection, the default value will apply and no name will be stored}
- procedure TExtIniF.RegisterObject(obj: TObject; INISection: string);
- begin
- {check if object is already registered}
- if ( FRegObjects.indexOfObject(obj) = -1 ) then
- FRegObjects.addObject(INISection,obj);
- end;
-
- { Remove an object from the list of monitored objects.}
- procedure TExtIniF.UnRegisterObject(obj: TObject; INISection: string);
- var
- index: integer;
- begin
- index:= FRegObjects.indexOfObject(obj);
- if ( index > -1 ) then
- FRegObjects.delete(index);
- end;
-
-
- { Restores the name of an object from the INI-File
- Note: When there is no entry in the INI-File, the object's value
- is not changed.}
- procedure TExtIniF.ReStoreObjectState(obj: TObject; INISection: string);
- var
- strBuf: string;
- begin
- if ( INISection = '' ) then INISection:= FIniSection;
- {the next lines check for the type of object and
- restore whatever property we would like to store of that object
- if you make changes here you will need to make changes in
- StoreObjectState as well!!!}
- if (obj.classInfo <> nil ) then begin
- if (obj is TCheckBox) then begin
- with (obj as TCheckBox) do begin
- {Checkboxes: restore checked state}
- checked:= readBool(INISection,Name,checked);
- end;
- end else
- if (obj is TEdit) then begin
- with (obj as TEdit) do begin
- {Editfield: restore text}
- text:= readString(INISection,Name,text);
- end;
- end else
- if (obj is TMenuItem) then begin
- with (obj as TMenuItem) do begin
- {Menuitem: restore checked state}
- checked:= readBool(INISection,Name,checked);
- end;
- end else
- if (obj is TTabbedNoteBook) then begin
- with (obj as TTabbedNoteBook) do begin
- {Notebook: restore open Tab}
- pageIndex:= readInteger(INISection,Name,pageIndex);
- end;
- end else
- if (obj is TDriveComboBox) then begin
- with (obj as TDriveComboBox) do begin
- {DriveCombo: restore selected drive}
- strBuf:= readString(INISection,Name,Drive);
- Drive:= strBuf[1];
- end;
- end else
- if (obj is TDirectoryListBox) then begin
- with (obj as TDirectoryListBox) do begin
- {DirectoryList: restore current directory}
- Directory:= readString(INISection,Name,Directory);
- end;
- end else
- raise EExtIniFError.create('This object is not supported!');
- end;
- end;
-
- { Restores the state of all registered objects
- from the INI-File}
- procedure TExtIniF.RestoreObjectStates;
- var
- objNo: integer;
- begin
- {iterate through all registered objects}
- for objNo:= 0 to FRegObjects.count - 1 do
- ReStoreObjectState(FRegObjects.objects[objNo],FRegObjects.strings[objNo]);
- end;
-
- { Stores the state of an object to the INI-File}
- procedure TExtIniF.StoreObjectState(obj: TObject; INISection: string);
- var
- strBuf: string;
- begin
- if ( INISection = '' ) then INISection:= FIniSection;
-
- {the next lines check for the type of object and
- store whatever property we would like to store of that object
- if you make changes here you will need to make changes in
- ReStoreObjectState as well!!!}
-
- if (obj.classInfo <> nil ) then begin
- if (obj is TCheckBox) then begin
- {Checkboxes: store checked state}
- with (obj as TCheckBox) do begin
- writeBool(INISection,Name,checked);
- end;
- end else
- if (obj is TEdit) then begin
- {Editfield: store text}
- with (obj as TEdit) do begin
- writeString(INISection,Name,text);
- end;
- end else
- if (obj is TMenuItem) then begin
- {Menuitem: restore checked state}
- with (obj as TMenuItem) do begin
- writeBool(INISection,Name,checked);
- end;
- end else
- if (obj is TTabbedNoteBook) then begin
- with (obj as TTabbedNoteBook) do begin
- {Notebook: restore open Tab}
- writeInteger(INISection,Name,pageIndex);
- end;
- end else
- if (obj is TDriveComboBox) then begin
- with (obj as TDriveComboBox) do begin
- {DriveCombo: restore selected drive}
- writeString(INISection,Name,Drive);
- end;
- end else
- if (obj is TDirectoryListBox) then begin
- {DirectoryList: restore current directory}
- with (obj as TDirectoryListBox) do begin
- writeString(INISection,Name,Directory);
- end;
- end else
- raise EExtIniFError.create('This object is not supported!');
- end;
- end;
-
- { Stores the state of all registered objects
- to the INI-File}
- procedure TExtIniF.StoreObjectStates;
- var
- objNo: integer;
- begin
- for objNo:= 0 to FRegObjects.count - 1 do
- StoreObjectState(FRegObjects.objects[objNo],FRegObjects.strings[objNo]);
- end;
-
-
- end.